YAML && JSON && AWS CloudFormation
YAML nedir JSON nedir şimdi ne alaka yanına bir AWS servisi diyebilirsiniz. Neden öğreniyoruz aralarındaki bağlantı nedir hepsini anlatacağım. YAML ve JSON bir programlama dili değildir. Bunlar farklı syntax'lere sahip bir dosya formatıdır. Peki biz neden bilmek zorundayız YAML ve JSON'u. CloudFormation servisinin çalışması için template dosya hazırlamamız gerekiyor ve bu dosyanın formayı YAML ve JSON olması gererkiyor. Peki bu dosya ne işe yarıyor? Kabaca ifade edeyim siz bu dosyanın içine bişeyler yazıyorsunuz ve yazdığınız bilgilere göre makina ayağa kaldırıyorsunuz veya database oluşturuyorsunuz gibi birçok şey yapabiliyorsunuz. Şöyle diyebiliriz siz kağıt üstünde mimariyi oluşturuyorsunuz aws cloudformation servisine veriyorsunuz o sizin girdilerinize uygun ortamı hazırlıyor.
Neden öğrendiğimizin farkına vardıktan sonra şimdi YAML'dan başlayalım. Aslında sadece AWS için de değil DEVOPS tool'larında da bu formatı kullanıyor olacağız. YAML için kofigurasyon oluşturma formatı diyebiliriz.
YAML case sensitive'dir. Yani büyük küçük harf duyarlıdır. Uzantısı .yaml veya .yml olabilir. Key-Value çifti temel yapısıdır. Key ler her zaman string olmak zorundadır, value ler herhangi tipte olabilir.
Liste tanımlaması yaparken her item'dan önce (- ve boşluk) kullanılmalıdır. Ayrıca liste tanımlamasını [ , , ] şeklinde deyapabilirsiniz.
Key Value arasına ":" işareti konulur.
Araba:
- marka: BMW
model: 2012
- marka: Audi
model: 2020Dictionary yapısını da çeşitli şekilllerde kurabilirsiniz. 3 farklı yöntemi aşağıda belirteceğim.
friends:
- name: yaşar
age: 20
- {name: beşir, age: 25}
-
name: "sakıp"
age:23
"#" işareti yorum satırı için kullanılır.
Liste içindeki itemları yazarke "," ve boşluk kullanılır.
--- # Course List
[Aws/DevOps, Web Developer, QA Tester]Girinti kullanmak için tab'den ziyade boşluk kullanılır.
Bölümler ayırmak için 3 tire( --- ) kullanılır
Ayrıca yaml dosyası 3 tire( --- ) ile başlar 3 nokta(...) ile biter. Zorunlu değildir bu uygulama.
---
# A list of courses
- AWS
- DevOps
- Web Developer
...indentation yani girintiler önemlidir. Burada önemli olan husus şu boşluk olmalı ama ne kadar olduğu önemsizdir. eğer alt satıra yazılan ifade üsttekinin value sü ise en az bir boşluk olmalı, eğer onunda value'sü varsa bu sefer 2 boşluk bırakabilrsiniz. önemli onal parent child ilişkisi gibi düşünürseniz chil parent arasında en az bir boşluk olmalı. Aşağıdaki örnek gibi.
a:
b:
- c
- d
- e
f:
"ghi"Yukardaki yapı aslında YAML'ın Block tipidir. İlla bu şekilde yazmak zorunda değilsiniz. Aşağıdaki gibi JSON şeklinde de yazılabilir. Ama yukarıdaki tip daha anlaşılırdır.
John MC {hr: 65, avg: 0.278}
James Oliver: {
hr: 63,
avg: 0.288
}( | ) işaretinden sonra gelen her satır ayrı değerlendirilir.
( > ) işaretinden sonra gelen tüm satırlar tek satır gibi değerlendirilir. Uzun text leri okunabilir olsun diye kullanılabilir.
data: |
Her
satır
degerlendirilir
data: >
tüm
satır
tek bir
satır gibidir.Çift tırnak ( " " ) veya tek tırnak( ' ' ) kullanılabilir.
Sayılar integer, octal, hexadecimal, float veya infinity(.inf) olabilir.
tarih formatı 2020-03-15 şeklindedir.
(!!) işareti format değiştirmek için kullanılır.
age: !!float 23 # 23.0 olur
Sıra geldi JSON'a. JSON özellikle verilerin transferinde kullanılan bir formattır. Çok az yer kaplar, Konfigurasyon dosyalarında ve API'lerde kullanılır. Örneğin siz form doldurdunuz ve gönderdiniz bilgiler JSON'a döüştürülüp bir yerden diğer yere iletilir. YAML'a bnezerdir ama onun kadar esnek değildir.
Veriler key: value çifti olarak tutulur. Datalar (,) ile ayrılır. { } veya [ ] verileri oluşturmak için her ikisi de kullanılabilir.
{
"employees":[ "John", "Aaron", "James" , "Oliver" , "Walter" ]
}Function ve date kullanılamaz. Sayı olarak sadece number kullanılabilir.
Stringlerde (" ") kullanmak zorunludur. YAML da kullanbiliyorduk.
Yorum satırı girilemez. Dikkat edelim eğer yaml dosyasını json a dönüştürmek istersek ve json desteklemediği bir husus olursa hata alırız.

YAML ve JSON hakkında temel bilgiyi aldıktan sonra bunu kullanacağımız AWS sevisi CloudFormation'a geçebiliriz. Öncelikle bu servisi kullanmak ücretsiz hazırladığınız template sonrası çalışan kaynakların ücreti olacaktır. Peki neden bu servise ihtiyacımız var? Biz arayüz kullanarak instance ayağa kaldırabiliyoruz. Ancak birden fazla ilişkili servisin birden fazla kaynağını kullanacak bir senaryoya ihitacınız varsa ve bu formatı başka müşterilerde de kullanacaksanız mimarisini önceden hazırlarsanız her seferin de tek tek uğraşmadan tek adımda oluştuabilirsiniz.

Cloudformation infrastructer as a code tool udur. Bunun karşılığı diğer sistemlerde de kullanılan Terraform tool udur. Bu servis sadece AWS özelinde kullanılabilir.
yaml veya json olarak template hazırlanır. Template hazırlamak için vscode programını kullanabilirsiniz. Aşağıdaki extention ları kurmanız yaml dosyası hazırlarken işinizi kolaylaştıracaktır.
Name: YAML
Id: redhat.vscode-yaml
Name: YAML JSON
Id: hilleer.yaml-plus-json
Name: CloudFormation Linter
Id: kddejong.vscode-cfn-lint
Name: CloudFormation Snippets
Id: dsteenman.cloudformation-yaml-snippets
Template hazırlamaya başlıyoruz. Basit bir uygulama yapacağız bir instance ayağa kaldıracak dosyayı hazırlayacağız.
ilk satıra cfn yazdığınızda Cloudformation görülecek tıkladığınızda aşağıdaki formatı göreceksiniz.
AWSTemplateFormatVersion: 2010-09-09
Description: |
Parameters:
Metadata:
Mappings:
Conditions:
Resources:
Transform:
Outputs:Gördüğünüz gibi YAML formatı. ( bölümden Resources hariç diğer 7 si optionaldır zorunlu değildir.
Resourse kısmına ec2-instance yazıldığında;
Type: AWS::EC2::Instance
Properties:
AdditionalInfo: "String"
Affinity: "String"
AvailabilityZone: "String"
BlockDeviceMappings:
BlockDeviceMappings
CpuOptions:
CoreCount: Number
ThreadsPerCore: Number
CreditSpecification:
CPUCredits: "Number"
DisableApiTermination: false
EbsOptimized: false
ElasticGpuSpecifications:
ElasticGpuSpecifications
ElasticInferenceAccelerators:
ElasticInferenceAccelerators
EnclaveOptions:
Enabled: false
HibernationOptions:
Configured: false
HostId: "String"
HostResourceGroupArn: "String"
IamInstanceProfile: "String"
ImageId: "String"
InstanceInitiatedShutdownBehavior: "String"
InstanceType: "String"
Ipv6AddressCount: Number
Ipv6Addresses:
Ipv6Addresses
KernelId: "String"
KeyName: "String"
LaunchTemplate:
LaunchTemplateId: "String"
LaunchTemplateName: "String"
Version: "String"
LicenseSpecifications:
LicenseSpecifications
Monitoring: String
NetworkInterfaces:
NetworkInterfaces
PlacementGroupName: "String"
PrivateIpAddress: "String"
RamdiskId: "String"
SecurityGroupIds:
SecurityGroupIds
SecurityGroups:
SecurityGroups
SourceDestCheck: false
SsmAssociations:
SsmAssociations
SubnetId: "String"
Tags:
Tags
Tenancy: "String"
UserData: "String"
Volumes:
VolumesGörüldüğü gibi uzun bir format geldi. Bu alanlardan hepsini doldurmak zorunda değilsiniz ihtiyacınız olan alalar haricindeki diğer alanları silerseniz default değerler atanacaktır.
logical_id kısmına istediğiniz ismi verebilirsiniz.
imageid kısmına seçmek istediğiniz image id yi girmeniz gerekiyor. Ben Amazon Ami seçtim.
instanceType olarak t2.micro giriyorum
security grup kısmına daha önce hazırladığınız uygun birinin ismini yazabilirsiniz. Ancak burada önemli bir husus var tiplerini doğru girmeliyiz. sg formatı dokümanında list of string olduğu için alt satıra geçip - işareti ile değeri girmeliyiz. İncelemek için Dokümantasyon linkini bırakıyorum.
SecurityGroups:
- launch-wizard-3tags kısmı da list of string ve key value kullanamak gerekir.
Tags:
- Key: Name
Value: CFNicin
- Key: Department
Value: ikkey için pem uzantılı dosyanın adını giriyoruz .pem yazılamayacak.
AWSTemplateFormatVersion: 2010-09-09
Resources:
sametcfn:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-02e136e904f3da870
InstanceType: t2.micro
KeyName: key
SecurityGroups:
- launch-wizard-3
Tags:
- Key: Name
Value: CFNicin
- Key: Department
Value: ikBasitçe yukarıdaki gibi gerekli olanları hazırladık yml olarak kaydediyoruz. Birazdan kullanacağız. Uzantı farklı olsada template içi yaml veya json formatında olmalı. CloudFormation servisine gidip "create stack" kısmına gidelim. Karşımıza aşağıdaki gibi bir sayfa çıkacak.

3 seçenek var biz template hazırladığımız için birincisini kullanacağız. İkincisi hazır templatelerden seçim üçüncüsü ise arayüzü olan bir designer ile yapılan tip.
s3 depodan veya localinizden yükleyeceksiniz. Localden yüklediğinizde otomatik s3 e atacak. Next diyoruz.
Stack'e bir isim girelim ve next diyelim. Dilerseniz tag girebilirsiniz. Diğer kısımları default bırakıp create stack ile stack yaratılıyor. Event kısmını takip edelim. Bir süre sonra hazır olacak ve "CREATE_COMPLETE" gördüğünüzde artık hazır olmuş olacak. ec2 sayfasına gidip ec2 muzun ayağa kalktığını görebiliriz 🙂
Yarattığınız stack'i silmeyi unutmayın ec2 free tier hakkınız yoksa para yazacak 😂
𝒟𝒜𝐻𝒜 Ö𝒵𝒢Ü𝑅 𝐵İ𝑅 𝒟Ü𝒩𝒴𝒜’𝒟𝒜 𝒢Ö𝑅ÜŞ𝑀𝐸𝒦 Ü𝒵𝐸𝑅𝐸
𝒮𝒜Ğ𝐿𝐼𝒞𝒜𝒦𝐿𝒜 𝒦𝒜𝐿𝐼𝒩